/*
 * VariableSizeRecordSerializer.h
 *
 *  Created on: Oct 23, 2012
 *      Author: m
 */

#ifndef VARIABLESIZESERIALIZER_H_
#define VARIABLESIZESERIALIZER_H_

#include <list>
#include <memory>
#include <cstring>
#include "../common_components/physical_layer_commons.h"

namespace physical
{

/**
 *  Interfáz para serializadores
 */
template <typename T> class Serializer
{
public:
    typedef T _T; // El tipo T

public:

    /**
     * Destructor
     */
    virtual ~Serializer(){};

    /**
     * Serializa un Elemento
     *
     * @param element Elemento a serializar
     * @param block Array de bytes en donde se serializa el elemento
     * @return Cantidad de bytes escritos en el block
     */
    virtual size_t serialize( const _T &element, byteStream block ) = 0;

    /**
     * Deserializa un Elemento
     *
     * @param block Array de bytes donde está serializado el elemento
     * @param element Referencia al elemento deserializado
     * @return Cantidad de bytes utilizados de block para deserializar
     */
    virtual size_t deserialize( const byteStream block, _T &element ) = 0;

    /**
     * Devuelve la cantidad de bytes que ocupa el elemento al ser serializado
     *
     * @param element Elemento a probar
     * @return Cantidad de bytes que ocuparía el elemento serializado
     */
    virtual size_t getSize( const _T &element ) = 0;

};

/*************************************************************
 **********************   Exepciones   **********************
 *************************************************************/

/**
 * Excepción Genérica de Serializer
 */
class SerializerException : public PhysicalException
{
};

} /* namespace physical */
#endif /* VARIABLESIZESERIALIZER_H_ */
